package leetcode;
import java.util.Arrays;
import java.util.HashMap;
/**
 * 负数 进行 位运算 是没有问题 的 成功了的 跟正数 是一样的 效果
 * 但是 底层的 二进制 数 可能 不太一样
 * 
 * 
 * 宫水三叶 的  三种 方式 解决 的 方法：
 * https://leetcode-cn.com/problems/array-of-doubled-pairs/solution/by-ac_oier-d1z7/
 * 主要关注 一下 第三 种 
 * 的 拓扑排序的 方法  因为 在 练一下 图 
 * 
 * 
 * 初始提交的 代码   能解决  不包含 0 的  情况 
 * 0 
 * 直接 拎出来 单独 判断 
 * @author I adore you
 *
 */
public class leetcode954二倍数对数组 {
	static Integer i ;
	public static boolean solution(int arr[]) {
		int count = 0;
		HashMap<Integer,Integer> map = new HashMap<>();
		for(int i = 0; i < arr.length; i++) {
//			if(!map.containsKey(arr[i])) {
//				map.put(arr[i],1);
//			}
			if(arr[i] == 0) {
				count++;
				continue;
			}
			int value  = arr[i]>>1;
//		map.containsKey(arr[i] ==  value << 1)
			 if(arr[i] == (value << 1) && map.containsKey(value)) {
//				--(map.get(arr[i] >> 1).intValue()
//				(--(map.get(arr[i] >>1).intValue()))  不能 用 -- 什么 意思
//				 上面 两个 都报错 我靠
//				map.get(arr[i]>>1)
//				map.put(arr[i]>>1,map.get(arr[i] >> 1)-1);
//				if( map.get(arr[i] >> 1)== 0) {
//					map.remove(arr[i]>>1);
//				}
				 map.put(value, map.get(value)-1);
				 if(map.get(value) == 0) {
					 map.remove(value);
				 }
			}
//			 map.containsKey(arr[i] << 1)
			 else if(map.containsKey(arr[i] << 1)  ) {
				int temp = arr[i] << 1;
				map.put(temp, map.get(temp) - 1);
				if(map.get(temp) == 0) {
					map.remove(temp);
				}
			}
			else {
				if(!map.containsKey(arr[i])) {
					map.put(arr[i],1);
				}
				else {
					map.put(arr[i],map.get(arr[i])+1);
				}
			}
		}
		if(map.size() == 0 && count % 2 == 0) {
			return true;
		}
		return false;
	}
	public static void main(String []args) {
//		System.out.println(i.intValue());
//		int value = 19;
//		--value;
		int arr[] = {2,4,0,0,8,1};
		Arrays.sort(arr);
		System.out.println(solution(arr));
		System.out.println(-4<<1);
		
	}
}
